Libraries

# Load necessary libraries
library(forecast)
library(tseries)
library(TSA)
library(tidyverse)
library(rugarch)

AAPL Monthly Data 2016-2024

Load & Inspect the Data

# Load the data
aapl_monthly_data <- read.csv("~/Documents/GitHub/MA-641-Course-Project/AAPL_Monthly2016.csv")

# Convert the date column to Date type
aapl_monthly_data$Date <- as.Date(aapl_monthly_data$Date, format="%Y-%m-%d")

# Inspect the data
head(aapl_monthly_data)
summary(aapl_monthly_data)
      Date                 Open             High             Low             Close       
 Min.   :2016-01-01   Min.   : 23.49   Min.   : 24.72   Min.   : 22.37   Min.   : 23.43  
 1st Qu.:2018-02-01   1st Qu.: 41.74   1st Qu.: 44.30   1st Qu.: 40.16   1st Qu.: 41.95  
 Median :2020-03-01   Median : 71.56   Median : 81.06   Median : 64.09   Median : 73.45  
 Mean   :2020-03-01   Mean   : 94.47   Mean   :101.04   Mean   : 88.97   Mean   : 95.93  
 3rd Qu.:2022-04-01   3rd Qu.:148.99   3rd Qu.:157.50   3rd Qu.:138.27   3rd Qu.:149.80  
 Max.   :2024-05-01   Max.   :196.24   Max.   :199.62   Max.   :187.45   Max.   :196.45  
   Adj.Close          Volume         
 Min.   : 21.39   Min.   :9.697e+08  
 1st Qu.: 39.72   1st Qu.:1.676e+09  
 Median : 71.54   Median :2.240e+09  
 Mean   : 93.98   Mean   :2.320e+09  
 3rd Qu.:147.50   3rd Qu.:2.801e+09  
 Max.   :195.41   Max.   :6.280e+09  

About the Data:

  • 101 data points spanning from 01/01/16 to 05/01/24
  • Data includes the monthly open, high, low, close, and adjusted close prices of the apple stock

Create a Time Series Object

# Create a time series object
aaplmonthly_ts <- ts(aapl_monthly_data$Close, start=c(2016, 01), end = c(2024, 05), frequency=12) 

Descripvtive Analysis

# Descriptive Analysis
plot(aaplmonthly_ts, main="Monthly Apple Stock Prices", ylab="Close Price", xlab="Time")

summary(aaplmonthly_ts)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  23.43   41.95   73.45   95.93  149.80  196.45 
boxplot(aaplmonthly_ts ~ cycle(aaplmonthly_ts), main="Seasonal Boxplot of Monthly Apple Stock Prices", ylab="Close Price")

Time Series Plot:

  • There is a clear upward trend in Apple stock prices over the period. The prices show a substantial increase, particularly starting around 2019.
  • There is visible volatility in the stock prices, with fluctuations becoming more pronounced in the later years.
  • The increased volatility may imply higher risk for investors, as the stock prices have larger swings.

Summary:

  • The mean and median values suggest that the central tendency of the stock prices is around 73 to 96.
  • The range indicates that the stock price has varied significantly over the period.

Seasonal Boxplot:

  • The presence of seasonality suggests that certain months tend to have higher or lower stock prices consistently, which can be crucial for seasonal trading strategies.
  • The seasonal boxplot reveals monthly patterns and variability, suggesting that seasonality should be considered in trading strategies and risk

ACF, PACF, & EACF Plots

# ACF and PACF Plots
par(mar=c(5, 5, 4, 2) + 0.1)
acf(aaplmonthly_ts, main="ACF of Monthly Apple Stock Prices", lag.max = 72)

pacf(aaplmonthly_ts, main="PACF of Monthly Apple Stock Prices", lag.max = 72)

eacf(aaplmonthly_ts)
AR/MA
  0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 x x x x x x x x x x x  x  x  x 
1 o x o o o o o o o o o  o  o  o 
2 x x o o o o o o x o o  o  o  o 
3 o o o o o o o o o o o  o  o  o 
4 x o o o o o o o o o o  o  o  o 
5 o o o o o o o o o o o  o  o  o 
6 o o o o o o o o o o o  o  o  o 
7 o o o x o o o o o o o  o  o  o 

ACF Plot:

  • The gradual decay in the ACF indicates the presence of a trend component in the time series. The series is likely non-stationary.
  • Significant autocorrelations suggest that the data is not random and past values can help predict future values.
  • A high degree of positive autocorrelation at the first few lags implies momentum in the stock prices, which is common in financial time series.

PACF Plot:

  • The sharp drop after the first lag in the PACF suggests that an AR(1) model may be appropriate for capturing the relationship in the data.
  • The significant first lag indicates that the immediate past value has a strong influence on the current value, while the influence of values further in the past diminishes quickly.
  • This pattern supports the use of a simple autoregressive model, as the complexity beyond the first lag does not add much explanatory power.

ADF Test

# Augmented Dickey-Fuller Test
adf_test <- adf.test(aaplmonthly_ts, alternative="stationary")
print(adf_test)

    Augmented Dickey-Fuller Test

data:  aaplmonthly_ts
Dickey-Fuller = -2.3411, Lag order = 4, p-value = 0.4353
alternative hypothesis: stationary
  • Since the p-value is greater than 0.05, we fail to reject the null hypothesis that the time series has a unit root. This indicates that the series is non-stationary.
  • The non-stationarity observed from the ADF test results implies that differencing the time series is necessary to achieve stationarity.
# Differencing the series if it is not stationary
if (adf_test$p.value > 0.05) {
  ts_data_diff <- diff(aaplmonthly_ts, differences=1)
  adf_test_diff <- adf.test(ts_data_diff, alternative="stationary")
  print(adf_test_diff)
  
  # Update the time series data to the differenced series
  aaplmonthly_ts <- ts_data_diff
}
Warning: p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  ts_data_diff
Dickey-Fuller = -5.0114, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary
  • Since the p-value is less than 0.05, we reject the null hypothesis that the time series has a unit root. This indicates that the differenced series is stationary.
  • With the differenced series being stationary, it is now suitable for fitting ARIMA models.
# Time Series Plot after Differencing
plot(aaplmonthly_ts, main="Monthly Apple Stock Prices", ylab="Close Price", xlab="Time")

  • We can see that after differencing the time-series appears to be stationary.

Fit AR, MA, and ARMA Models

AR Model

# Fit AR model
ar_model <- Arima(aaplmonthly_ts, order=c(2,0,0))
summary(ar_model)
Series: aaplmonthly_ts 
ARIMA(2,0,0) with non-zero mean 

Coefficients:
         ar1      ar2    mean
      0.0409  -0.2708  1.6476
s.e.  0.0988   0.0980  0.6883

sigma^2 = 73.24:  log likelihood = -355.13
AIC=718.27   AICc=718.69   BIC=728.69

Training set error measures:
                       ME     RMSE     MAE      MPE     MAPE      MASE         ACF1
Training set -0.000308276 8.428628 6.23919 507.0341 563.7521 0.7036177 -0.001614169
  • AR(1) Coefficient=0.0409, is a small positive value close to zero which suggests a weak positive correlation with the immediate past month’s value
  • AR(2) Coefficient=-0.2708, is a negative value which suggests that the price two months ago has a moderate inverse relationship with the current month’s price
  • Mean=1.6476, the average level of the series after removing the autoregressive effects
  • The AR(1) coefficient is small, while the AR(2) coefficient is moderate and negative, suggesting some complexity in how past values relate to current values
  • The model accounts for the influence of two previous months’ prices, capturing both immediate and delayed effects
  • The variance is relatively high, which may indicate substantial unexplained variability
  • RMSE and MAE are moderate, indicating that the model has reasonable accuracy but could be improved
  • High MPE and MAPE suggest some forecasts might be significantly off from actual values
Residual Analysis
# Perform diagnostics for AR(2)
tsdiag(ar_model, gof.lag = 10, main = "Diagnostics for AR(2)")


# Q-Q plot for AR(2)
residuals_ar2 <- residuals(ar_model)
qqnorm(residuals_ar2, main = "Q-Q Plot of Residuals for AR(2)")
qqline(residuals_ar2, col = "red")

MA Model

# Fit MA model
ma_model <- Arima(aaplmonthly_ts, order=c(0,0,2))
summary(ma_model)
Series: aaplmonthly_ts 
ARIMA(0,0,2) with non-zero mean 

Coefficients:
         ma1      ma2    mean
      0.0231  -0.2775  1.6525
s.e.  0.0979   0.0971  0.6327

sigma^2 = 73.16:  log likelihood = -355.09
AIC=718.17   AICc=718.59   BIC=728.59

Training set error measures:
                       ME     RMSE     MAE      MPE     MAPE      MASE      ACF1
Training set -0.006781185 8.424279 6.24754 520.9368 585.7699 0.7045594 0.0114845
  • The small MA(1) coefficient suggests a weak impact of the error from one period ago, while the moderate negative MA(2) coefficient indicates a more noticeable inverse relationship with errors from two periods ago.
  • The variance (sigma^2) is moderate, consistent with the AR(2) model, suggesting a similar level of unexplained volatility.
  • RMSE and MAE are slightly lower than those of the AR(2) model, indicating that the MA(2) model may fit the data slightly better in terms of absolute error metrics.
  • The AIC and BIC values are very similar to those of the AR(2) model, suggesting that both models are comparable in fit.
  • The slightly lower AIC suggests the MA(2) model might be marginally better in terms of balancing model complexity and goodness of fit.
Residual Analysis
# Perform diagnostics for MA(2)
tsdiag(ma_model, gof.lag = 10, main = "Diagnostics for MA(2)")


# Q-Q plot for MA(2)
residuals_ma2 <- residuals(ma_model)
qqnorm(residuals_ma2, main = "Q-Q Plot of Residuals for MA(2)")
qqline(residuals_ma2, col = "red")

ARMA Model

# Fit ARMA(1,1,1) model
arma_model1 <- Arima(aaplmonthly_ts, order=c(1,1,1))
summary(arma_model1)
Series: aaplmonthly_ts 
ARIMA(1,1,1) 

Coefficients:
         ar1      ma1
      0.0413  -1.0000
s.e.  0.1034   0.0308

sigma^2 = 78.94:  log likelihood = -357.98
AIC=721.96   AICc=722.21   BIC=729.74

Training set error measures:
                    ME     RMSE      MAE     MPE     MAPE      MASE          ACF1
Training set 0.5179315 8.750795 6.505048 433.929 441.6441 0.7335995 -0.0008596899
  • The AR coefficient is weak, indicating a limited effect of past values on current values. The MA coefficient is very strong, indicating significant correction based on past errors.
  • The differencing part of the ARIMA model suggests that the data has been transformed to achieve stationarity, which might explain why the AR component is weak.
  • The variance of the residuals is moderate, suggesting some unexplained variability in the data.
  • RMSE and MAE are higher than in AR(2) and MA(2), indicating less precise predictions.
  • The AIC and BIC values suggest this model might not be the best fit compared to simpler models like AR(2) and MA(2), which had lower AIC/BIC values.
Residual Analysis
# Perform diagnostics for ARIMA(1,1,1)
tsdiag(arma_model1, gof.lag = 10, main = "Diagnostics for ARIMA(1,1,1)")


# Q-Q plot for ARIMA(1,1,1)
residuals_arma111 <- residuals(arma_model1)
qqnorm(residuals_arma111, main = "Q-Q Plot of Residuals for ARIMA(1,1,1)")
qqline(residuals_arma111, col = "red")

# ARMA(2,1,1) Model
arma_model2 <- Arima(aaplmonthly_ts, order=c(2,1,1))
summary(arma_model2)
Series: aaplmonthly_ts 
ARIMA(2,1,1) 

Coefficients:
         ar1      ar2      ma1
      0.0486  -0.2632  -1.0000
s.e.  0.0996   0.0988   0.0377

sigma^2 = 74.02:  log likelihood = -354.58
AIC=717.16   AICc=717.59   BIC=727.54

Training set error measures:
                    ME     RMSE      MAE      MPE     MAPE      MASE        ACF1
Training set 0.6253754 8.429532 6.225648 78.44247 127.6236 0.7020905 -0.01202426
  • The AR coefficients show a mixed impact, with a weak positive effect from the last period and a moderate negative effect from two periods ago. The strong MA(1) term suggests that recent errors are heavily corrected, which may smooth the series too aggressively.
  • The variance of the residuals is moderate, indicating a fair amount of explained variability. The error measures (RMSE and MAE) suggest that the model provides reasonably accurate predictions, although there are still areas for improvement.
  • The AIC and BIC values are relatively low, indicating a good fit compared to other models. The log likelihood is also higher, supporting this conclusion.
  • The ARIMA(2,1,1) model captures the data dynamics well, with strong correction for past errors and a reasonable account of past values. The model is effective in handling the data’s structure and trends, as indicated by the low error measures and ACF1.
Residual Analysis
# Perform diagnostics for ARIMA(2,1,1)
tsdiag(arma_model2, gof.lag = 10, main = "Diagnostics for ARIMA(2,1,1)")


# Q-Q plot for ARIMA(2,1,1)
residuals_arma211 <- residuals(arma_model2)
qqnorm(residuals_arma211, main = "Q-Q Plot of Residuals for ARIMA(2,1,1)")
qqline(residuals_arma211, col = "red")

# ARMA(2,1,2) Model
arma_model3 <- Arima(aaplmonthly_ts, order=c(2,1,2))
summary(arma_model3)
Series: aaplmonthly_ts 
ARIMA(2,1,2) 

Coefficients:
         ar1      ar2      ma1      ma2
      0.0375  -0.2628  -0.9880  -0.0120
s.e.  0.4098   0.1004   0.4284   0.4267

sigma^2 = 74.8:  log likelihood = -354.58
AIC=719.16   AICc=719.8   BIC=732.13

Training set error measures:
                    ME     RMSE      MAE      MPE     MAPE      MASE        ACF1
Training set 0.6240689 8.429788 6.223491 79.15774 126.6565 0.7018472 -0.01277316
  • The AR(2) term seems significant, while the AR(1) and MA(2) terms are less impactful. The MA(1) term is strong, suggesting reliance on correcting the previous period’s error.
  • The residual variance (sigma^2) is slightly higher than desired, indicating some unexplained variability. The ACF1 is close to zero, which is positive, indicating little remaining autocorrelation.
  • Compared to the ARIMA(2,1,1) model, this model has slightly higher AIC and BIC, suggesting it might not fit as well. However, the performance metrics (RMSE, MAE) are competitive, indicating this model is also a valid candidate.
  • While the error measures (MAPE, MPE) show some prediction errors, the model captures the general trend well. Improvements could be made by refining the model or testing alternative specifications.
Residual Analysis
# Perform diagnostics for ARIMA(2,1,2)
tsdiag(arma_model3, gof.lag = 10, main = "Diagnostics for ARIMA(2,1,2)")


# Q-Q plot for ARIMA(2,1,2)
residuals_arma212 <- residuals(arma_model3)
qqnorm(residuals_arma212, main = "Q-Q Plot of Residuals for ARIMA(2,1,2)")
qqline(residuals_arma212, col = "red")

GARCH Models

# Create a time series object
aaplmonthly_ts2 <- ts(aapl_monthly_data$Close, start=c(2016, 01), end = c(2024, 05), frequency=12) 
# Calculate returns for modeling
returns <- diff(log(aaplmonthly_ts2))
returns <- returns[!is.na(returns)]
plot(returns, main="Monthly Apple Stock Prices", ylab="Close Price", xlab="Time", type="l")

# Display the fit summary
fit_garch

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model  : ARFIMA(1,0,0)
Distribution    : norm 

Optimal Parameters
------------------------------------
        Estimate  Std. Error  t value Pr(>|t|)
mu      0.020696    0.008198  2.52440  0.01159
ar1     0.009283    0.100840  0.09206  0.92665
omega   0.000212    0.000204  1.03801  0.29927
alpha1  0.000000    0.014482  0.00000  1.00000
beta1   0.969597    0.051349 18.88262  0.00000

Robust Standard Errors:
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.020696    0.006649  3.112732 0.001854
ar1     0.009283    0.103105  0.090038 0.928257
omega   0.000212    0.000379  0.558168 0.576730
alpha1  0.000000    0.005313  0.000000 1.000000
beta1   0.969597    0.059723 16.234816 0.000000

LogLikelihood : 108.877 

Information Criteria
------------------------------------
                    
Akaike       -2.0775
Bayes        -1.9473
Shibata      -2.0822
Hannan-Quinn -2.0248

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                  0.0001857  0.9891
Lag[2*(p+q)+(p+q)-1][2] 1.2346095  0.5948
Lag[4*(p+q)+(p+q)-1][5] 2.4164966  0.5903
d.o.f=1
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.449  0.2287
Lag[2*(p+q)+(p+q)-1][5]     3.745  0.2876
Lag[4*(p+q)+(p+q)-1][9]     6.376  0.2572
d.o.f=2

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]     3.543 0.500 2.000 0.05978
ARCH Lag[5]     3.661 1.440 1.667 0.20717
ARCH Lag[7]     5.696 2.315 1.543 0.16300

Nyblom stability test
------------------------------------
Joint Statistic:  1.4525
Individual Statistics:              
mu     0.07109
ar1    0.14752
omega  0.14307
alpha1 0.12991
beta1  0.14386

Asymptotic Critical Values (10% 5% 1%)
Joint Statistic:         1.28 1.47 1.88
Individual Statistic:    0.35 0.47 0.75

Sign Bias Test
------------------------------------


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20      20.4       0.3709
2    30      21.8       0.8284
3    40      34.4       0.6796
4    50      42.0       0.7504


Elapsed time : 0.05360389 
# Specify GARCH(1,1) model
spec_garch <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
                         mean.model = list(armaOrder = c(2, 1)), 
                         distribution.model = "norm")

fit_garch <- ugarchfit(spec = spec_garch, data = returns)

# Display the fit summary
fit_garch

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model  : ARFIMA(2,0,1)
Distribution    : norm 

Optimal Parameters
------------------------------------
        Estimate  Std. Error  t value Pr(>|t|)
mu      0.020739    0.005744  3.61058 0.000306
ar1     0.604229    0.341075  1.77154 0.076471
ar2    -0.151955    0.108878 -1.39564 0.162824
ma1    -0.610786    0.339011 -1.80167 0.071598
omega   0.000208    0.000238  0.87143 0.383518
alpha1  0.000000    0.013219  0.00000 1.000000
beta1   0.968842    0.047477 20.40660 0.000000

Robust Standard Errors:
        Estimate  Std. Error  t value Pr(>|t|)
mu      0.020739    0.005612  3.69541 0.000220
ar1     0.604229    0.323349  1.86866 0.061671
ar2    -0.151955    0.095674 -1.58826 0.112228
ma1    -0.610786    0.293617 -2.08021 0.037506
omega   0.000208    0.000316  0.65791 0.510598
alpha1  0.000000    0.003947  0.00000 1.000000
beta1   0.968842    0.051773 18.71330 0.000000

LogLikelihood : 110.5264 

Information Criteria
------------------------------------
                    
Akaike       -2.0705
Bayes        -1.8882
Shibata      -2.0795
Hannan-Quinn -1.9967

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                         statistic p-value
Lag[1]                   0.0007236  0.9785
Lag[2*(p+q)+(p+q)-1][8]  0.7800872  1.0000
Lag[4*(p+q)+(p+q)-1][14] 1.9624525  0.9999
d.o.f=3
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                      2.977 0.08444
Lag[2*(p+q)+(p+q)-1][5]     4.546 0.19337
Lag[4*(p+q)+(p+q)-1][9]     6.847 0.21233
d.o.f=2

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]     2.326 0.500 2.000  0.1273
ARCH Lag[5]     2.329 1.440 1.667  0.4030
ARCH Lag[7]     4.181 2.315 1.543  0.3212

Nyblom stability test
------------------------------------
Joint Statistic:  2.2869
Individual Statistics:              
mu     0.14030
ar1    0.06721
ar2    0.04291
ma1    0.07467
omega  0.13026
alpha1 0.10397
beta1  0.13095

Asymptotic Critical Values (10% 5% 1%)
Joint Statistic:         1.69 1.9 2.35
Individual Statistic:    0.35 0.47 0.75

Sign Bias Test
------------------------------------


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20      27.6     0.091435
2    30      40.4     0.077606
3    40      47.2     0.172404
4    50      77.0     0.006497


Elapsed time : 0.0871799 
# Plot diagnostics
plot(fit_garch)

Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
1

Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
2

please wait...calculating quantiles...


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
3


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
4


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
5


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
6


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
7


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
8


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
9


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
10


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
11


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
12


Make a plot selection (or 0 to exit): 

 1:   Series with 2 Conditional SD Superimposed     2:   Series with 1% VaR Limits                  
 3:   Conditional SD (vs |returns|)                 4:   ACF of Observations                        
 5:   ACF of Squared Observations                   6:   ACF of Absolute Observations               
 7:   Cross Correlation                             8:   Empirical Density of Standardized Residuals
 9:   QQ-Plot of Standardized Residuals            10:   ACF of Standardized Residuals              
11:   ACF of Squared Standardized Residuals        12:   News-Impact Curve                          
0

Forecasting

# Forecasting with the TGARCH model
forecast_garch <- ugarchforecast(fit_garch, n.ahead=12)
plot(forecast_garch, which=1)  # Forecast series

Model Comparison

# Comparing Models using AIC and BIC
models <- list(ar_model, ma_model, arma_model1, arma_model2, arma_model3)
model_names <- c("AR", "MA", "ARIMA(1,1,1)", "ARIMA(2,1,1)", "ARIMA(2,1,2", "GARCH")

aic_values <- c(sapply(models, AIC), -2.0775)
bic_values <- c(sapply(models, BIC), -1.9473)

comparison <- data.frame(Model=model_names, AIC=aic_values, BIC=bic_values)
print(comparison)
LS0tCnRpdGxlOiAiQXBwbGUgU3RvY2sgRGF0YSAoTW9udGhseSAyMDE2LTIwMjQpIgphdXRob3I6ICJCcmlhbm5hIENpcmlsbG8iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KICAKIyMjIExpYnJhcmllcwoKYGBge3J9CiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeShUU0EpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJ1Z2FyY2gpCmBgYAogCgojIyBBQVBMIE1vbnRobHkgRGF0YSAyMDE2LTIwMjQKIyMjIExvYWQgJiBJbnNwZWN0IHRoZSBEYXRhCgpgYGB7cn0KIyBMb2FkIHRoZSBkYXRhCmFhcGxfbW9udGhseV9kYXRhIDwtIHJlYWQuY3N2KCJ+L0RvY3VtZW50cy9HaXRIdWIvTUEtNjQxLUNvdXJzZS1Qcm9qZWN0L0FBUExfTW9udGhseTIwMTYuY3N2IikKCiMgQ29udmVydCB0aGUgZGF0ZSBjb2x1bW4gdG8gRGF0ZSB0eXBlCmFhcGxfbW9udGhseV9kYXRhJERhdGUgPC0gYXMuRGF0ZShhYXBsX21vbnRobHlfZGF0YSREYXRlLCBmb3JtYXQ9IiVZLSVtLSVkIikKCiMgSW5zcGVjdCB0aGUgZGF0YQpoZWFkKGFhcGxfbW9udGhseV9kYXRhKQpzdW1tYXJ5KGFhcGxfbW9udGhseV9kYXRhKQpgYGAKCkFib3V0IHRoZSBEYXRhOgoKLSAxMDEgZGF0YSBwb2ludHMgc3Bhbm5pbmcgZnJvbSAwMS8wMS8xNiB0byAwNS8wMS8yNAotIERhdGEgaW5jbHVkZXMgdGhlIG1vbnRobHkgb3BlbiwgaGlnaCwgbG93LCBjbG9zZSwgYW5kIGFkanVzdGVkIGNsb3NlIHByaWNlcyBvZiB0aGUgYXBwbGUgc3RvY2sKCgoKIyMjIENyZWF0ZSBhIFRpbWUgU2VyaWVzIE9iamVjdAoKYGBge3J9CiMgQ3JlYXRlIGEgdGltZSBzZXJpZXMgb2JqZWN0CmFhcGxtb250aGx5X3RzIDwtIHRzKGFhcGxfbW9udGhseV9kYXRhJENsb3NlLCBzdGFydD1jKDIwMTYsIDAxKSwgZW5kID0gYygyMDI0LCAwNSksIGZyZXF1ZW5jeT0xMikgCmBgYAoKCgojIyMgRGVzY3JpcHZ0aXZlIEFuYWx5c2lzCgpgYGB7cn0KIyBEZXNjcmlwdGl2ZSBBbmFseXNpcwpwbG90KGFhcGxtb250aGx5X3RzLCBtYWluPSJNb250aGx5IEFwcGxlIFN0b2NrIFByaWNlcyIsIHlsYWI9IkNsb3NlIFByaWNlIiwgeGxhYj0iVGltZSIpCnN1bW1hcnkoYWFwbG1vbnRobHlfdHMpCmJveHBsb3QoYWFwbG1vbnRobHlfdHMgfiBjeWNsZShhYXBsbW9udGhseV90cyksIG1haW49IlNlYXNvbmFsIEJveHBsb3Qgb2YgTW9udGhseSBBcHBsZSBTdG9jayBQcmljZXMiLCB5bGFiPSJDbG9zZSBQcmljZSIpCmBgYApUaW1lIFNlcmllcyBQbG90OgoKLSBUaGVyZSBpcyBhIGNsZWFyIHVwd2FyZCB0cmVuZCBpbiBBcHBsZSBzdG9jayBwcmljZXMgb3ZlciB0aGUgcGVyaW9kLiBUaGUgcHJpY2VzIHNob3cgYSBzdWJzdGFudGlhbCBpbmNyZWFzZSwgcGFydGljdWxhcmx5IHN0YXJ0aW5nIGFyb3VuZCAyMDE5LgotIFRoZXJlIGlzIHZpc2libGUgdm9sYXRpbGl0eSBpbiB0aGUgc3RvY2sgcHJpY2VzLCB3aXRoIGZsdWN0dWF0aW9ucyBiZWNvbWluZyBtb3JlIHByb25vdW5jZWQgaW4gdGhlIGxhdGVyIHllYXJzLgotIFRoZSBpbmNyZWFzZWQgdm9sYXRpbGl0eSBtYXkgaW1wbHkgaGlnaGVyIHJpc2sgZm9yIGludmVzdG9ycywgYXMgdGhlIHN0b2NrIHByaWNlcyBoYXZlIGxhcmdlciBzd2luZ3MuCgpTdW1tYXJ5OgoKLSBUaGUgbWVhbiBhbmQgbWVkaWFuIHZhbHVlcyBzdWdnZXN0IHRoYXQgdGhlIGNlbnRyYWwgdGVuZGVuY3kgb2YgdGhlIHN0b2NrIHByaWNlcyBpcyBhcm91bmQgNzMgdG8gOTYuCi0gVGhlIHJhbmdlIGluZGljYXRlcyB0aGF0IHRoZSBzdG9jayBwcmljZSBoYXMgdmFyaWVkIHNpZ25pZmljYW50bHkgb3ZlciB0aGUgcGVyaW9kLgoKU2Vhc29uYWwgQm94cGxvdDoKCi0gVGhlIHByZXNlbmNlIG9mIHNlYXNvbmFsaXR5IHN1Z2dlc3RzIHRoYXQgY2VydGFpbiBtb250aHMgdGVuZCB0byBoYXZlIGhpZ2hlciBvciBsb3dlciBzdG9jayBwcmljZXMgY29uc2lzdGVudGx5LCB3aGljaCBjYW4gYmUgY3J1Y2lhbCBmb3Igc2Vhc29uYWwgdHJhZGluZyBzdHJhdGVnaWVzLgotIFRoZSBzZWFzb25hbCBib3hwbG90IHJldmVhbHMgbW9udGhseSBwYXR0ZXJucyBhbmQgdmFyaWFiaWxpdHksIHN1Z2dlc3RpbmcgdGhhdCBzZWFzb25hbGl0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBpbiB0cmFkaW5nIHN0cmF0ZWdpZXMgYW5kIHJpc2sgCgoKCgojIyMgQUNGLCBQQUNGLCAmIEVBQ0YgUGxvdHMKCmBgYHtyfQojIEFDRiBhbmQgUEFDRiBQbG90cwpwYXIobWFyPWMoNSwgNSwgNCwgMikgKyAwLjEpCmFjZihhYXBsbW9udGhseV90cywgbWFpbj0iQUNGIG9mIE1vbnRobHkgQXBwbGUgU3RvY2sgUHJpY2VzIiwgbGFnLm1heCA9IDcyKQpwYWNmKGFhcGxtb250aGx5X3RzLCBtYWluPSJQQUNGIG9mIE1vbnRobHkgQXBwbGUgU3RvY2sgUHJpY2VzIiwgbGFnLm1heCA9IDcyKQplYWNmKGFhcGxtb250aGx5X3RzKQpgYGAKCgpBQ0YgUGxvdDoKCi0gVGhlIGdyYWR1YWwgZGVjYXkgaW4gdGhlIEFDRiBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIGEgdHJlbmQgY29tcG9uZW50IGluIHRoZSB0aW1lIHNlcmllcy4gVGhlIHNlcmllcyBpcyBsaWtlbHkgbm9uLXN0YXRpb25hcnkuCi0gU2lnbmlmaWNhbnQgYXV0b2NvcnJlbGF0aW9ucyBzdWdnZXN0IHRoYXQgdGhlIGRhdGEgaXMgbm90IHJhbmRvbSBhbmQgcGFzdCB2YWx1ZXMgY2FuIGhlbHAgcHJlZGljdCBmdXR1cmUgdmFsdWVzLgotIEEgaGlnaCBkZWdyZWUgb2YgcG9zaXRpdmUgYXV0b2NvcnJlbGF0aW9uIGF0IHRoZSBmaXJzdCBmZXcgbGFncyBpbXBsaWVzIG1vbWVudHVtIGluIHRoZSBzdG9jayBwcmljZXMsIHdoaWNoIGlzIGNvbW1vbiBpbiBmaW5hbmNpYWwgdGltZSBzZXJpZXMuCgoKUEFDRiBQbG90OgoKLSBUaGUgc2hhcnAgZHJvcCBhZnRlciB0aGUgZmlyc3QgbGFnIGluIHRoZSBQQUNGIHN1Z2dlc3RzIHRoYXQgYW4gQVIoMSkgbW9kZWwgbWF5IGJlIGFwcHJvcHJpYXRlIGZvciBjYXB0dXJpbmcgdGhlIHJlbGF0aW9uc2hpcCBpbiB0aGUgZGF0YS4KLSBUaGUgc2lnbmlmaWNhbnQgZmlyc3QgbGFnIGluZGljYXRlcyB0aGF0IHRoZSBpbW1lZGlhdGUgcGFzdCB2YWx1ZSBoYXMgYSBzdHJvbmcgaW5mbHVlbmNlIG9uIHRoZSBjdXJyZW50IHZhbHVlLCB3aGlsZSB0aGUgaW5mbHVlbmNlIG9mIHZhbHVlcyBmdXJ0aGVyIGluIHRoZSBwYXN0IGRpbWluaXNoZXMgcXVpY2tseS4KLSBUaGlzIHBhdHRlcm4gc3VwcG9ydHMgdGhlIHVzZSBvZiBhIHNpbXBsZSBhdXRvcmVncmVzc2l2ZSBtb2RlbCwgYXMgdGhlIGNvbXBsZXhpdHkgYmV5b25kIHRoZSBmaXJzdCBsYWcgZG9lcyBub3QgYWRkIG11Y2ggZXhwbGFuYXRvcnkgcG93ZXIuCgoKCiMjIyBBREYgVGVzdAoKYGBge3J9CiMgQXVnbWVudGVkIERpY2tleS1GdWxsZXIgVGVzdAphZGZfdGVzdCA8LSBhZGYudGVzdChhYXBsbW9udGhseV90cywgYWx0ZXJuYXRpdmU9InN0YXRpb25hcnkiKQpwcmludChhZGZfdGVzdCkKYGBgCgoKLSBTaW5jZSB0aGUgcC12YWx1ZSBpcyBncmVhdGVyIHRoYW4gMC4wNSwgd2UgZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSB0aW1lIHNlcmllcyBoYXMgYSB1bml0IHJvb3QuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHNlcmllcyBpcyBub24tc3RhdGlvbmFyeS4KLSBUaGUgbm9uLXN0YXRpb25hcml0eSBvYnNlcnZlZCBmcm9tIHRoZSBBREYgdGVzdCByZXN1bHRzIGltcGxpZXMgdGhhdCBkaWZmZXJlbmNpbmcgdGhlIHRpbWUgc2VyaWVzIGlzIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHN0YXRpb25hcml0eS4KCgoKYGBge3J9CiMgRGlmZmVyZW5jaW5nIHRoZSBzZXJpZXMgaWYgaXQgaXMgbm90IHN0YXRpb25hcnkKaWYgKGFkZl90ZXN0JHAudmFsdWUgPiAwLjA1KSB7CiAgdHNfZGF0YV9kaWZmIDwtIGRpZmYoYWFwbG1vbnRobHlfdHMsIGRpZmZlcmVuY2VzPTEpCiAgYWRmX3Rlc3RfZGlmZiA8LSBhZGYudGVzdCh0c19kYXRhX2RpZmYsIGFsdGVybmF0aXZlPSJzdGF0aW9uYXJ5IikKICBwcmludChhZGZfdGVzdF9kaWZmKQogIAogICMgVXBkYXRlIHRoZSB0aW1lIHNlcmllcyBkYXRhIHRvIHRoZSBkaWZmZXJlbmNlZCBzZXJpZXMKICBhYXBsbW9udGhseV90cyA8LSB0c19kYXRhX2RpZmYKfQpgYGAKCgotIFNpbmNlIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiAwLjA1LCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSB0aW1lIHNlcmllcyBoYXMgYSB1bml0IHJvb3QuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRpZmZlcmVuY2VkIHNlcmllcyBpcyBzdGF0aW9uYXJ5LgotIFdpdGggdGhlIGRpZmZlcmVuY2VkIHNlcmllcyBiZWluZyBzdGF0aW9uYXJ5LCBpdCBpcyBub3cgc3VpdGFibGUgZm9yIGZpdHRpbmcgQVJJTUEgbW9kZWxzLgogCgpgYGB7cn0KIyBUaW1lIFNlcmllcyBQbG90IGFmdGVyIERpZmZlcmVuY2luZwpwbG90KGFhcGxtb250aGx5X3RzLCBtYWluPSJNb250aGx5IEFwcGxlIFN0b2NrIFByaWNlcyIsIHlsYWI9IkNsb3NlIFByaWNlIiwgeGxhYj0iVGltZSIpCmBgYAoKLSBXZSBjYW4gc2VlIHRoYXQgYWZ0ZXIgZGlmZmVyZW5jaW5nIHRoZSB0aW1lLXNlcmllcyBhcHBlYXJzIHRvIGJlIHN0YXRpb25hcnkuCgojIyMgRml0IEFSLCBNQSwgYW5kIEFSTUEgTW9kZWxzCiMjIyMgQVIgTW9kZWwKYGBge3J9CiMgRml0IEFSIG1vZGVsCmFyX21vZGVsIDwtIEFyaW1hKGFhcGxtb250aGx5X3RzLCBvcmRlcj1jKDIsMCwwKSkKc3VtbWFyeShhcl9tb2RlbCkKYGBgCgoKLSBBUigxKSBDb2VmZmljaWVudD0wLjA0MDksIGlzIGEgc21hbGwgcG9zaXRpdmUgdmFsdWUgY2xvc2UgdG8gemVybyB3aGljaCBzdWdnZXN0cyBhIHdlYWsgcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCB0aGUgaW1tZWRpYXRlIHBhc3QgbW9udGgncyB2YWx1ZQotIEFSKDIpIENvZWZmaWNpZW50PS0wLjI3MDgsIGlzIGEgbmVnYXRpdmUgdmFsdWUgd2hpY2ggc3VnZ2VzdHMgdGhhdCB0aGUgcHJpY2UgdHdvIG1vbnRocyBhZ28gaGFzIGEgbW9kZXJhdGUgaW52ZXJzZSByZWxhdGlvbnNoaXAgd2l0aCB0aGUgY3VycmVudCBtb250aCdzIHByaWNlCi0gTWVhbj0xLjY0NzYsIHRoZSBhdmVyYWdlIGxldmVsIG9mIHRoZSBzZXJpZXMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGF1dG9yZWdyZXNzaXZlIGVmZmVjdHMKLSBUaGUgQVIoMSkgY29lZmZpY2llbnQgaXMgc21hbGwsIHdoaWxlIHRoZSBBUigyKSBjb2VmZmljaWVudCBpcyBtb2RlcmF0ZSBhbmQgbmVnYXRpdmUsIHN1Z2dlc3Rpbmcgc29tZSBjb21wbGV4aXR5IGluIGhvdyBwYXN0IHZhbHVlcyByZWxhdGUgdG8gY3VycmVudCB2YWx1ZXMKLSBUaGUgbW9kZWwgYWNjb3VudHMgZm9yIHRoZSBpbmZsdWVuY2Ugb2YgdHdvIHByZXZpb3VzIG1vbnRocycgcHJpY2VzLCBjYXB0dXJpbmcgYm90aCBpbW1lZGlhdGUgYW5kIGRlbGF5ZWQgZWZmZWN0cwotIFRoZSB2YXJpYW5jZSBpcyByZWxhdGl2ZWx5IGhpZ2gsIHdoaWNoIG1heSBpbmRpY2F0ZSBzdWJzdGFudGlhbCB1bmV4cGxhaW5lZCB2YXJpYWJpbGl0eQotIFJNU0UgYW5kIE1BRSBhcmUgbW9kZXJhdGUsIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgaGFzIHJlYXNvbmFibGUgYWNjdXJhY3kgYnV0IGNvdWxkIGJlIGltcHJvdmVkCi0gSGlnaCBNUEUgYW5kIE1BUEUgc3VnZ2VzdCBzb21lIGZvcmVjYXN0cyBtaWdodCBiZSBzaWduaWZpY2FudGx5IG9mZiBmcm9tIGFjdHVhbCB2YWx1ZXMKCgojIyMjIyBSZXNpZHVhbCBBbmFseXNpcwoKYGBge3J9CiMgUGVyZm9ybSBkaWFnbm9zdGljcyBmb3IgQVIoMikKdHNkaWFnKGFyX21vZGVsLCBnb2YubGFnID0gMTAsIG1haW4gPSAiRGlhZ25vc3RpY3MgZm9yIEFSKDIpIikKCiMgUS1RIHBsb3QgZm9yIEFSKDIpCnJlc2lkdWFsc19hcjIgPC0gcmVzaWR1YWxzKGFyX21vZGVsKQpxcW5vcm0ocmVzaWR1YWxzX2FyMiwgbWFpbiA9ICJRLVEgUGxvdCBvZiBSZXNpZHVhbHMgZm9yIEFSKDIpIikKcXFsaW5lKHJlc2lkdWFsc19hcjIsIGNvbCA9ICJyZWQiKQpgYGAKCgoKCiMjIyMgTUEgTW9kZWwKYGBge3J9CiMgRml0IE1BIG1vZGVsCm1hX21vZGVsIDwtIEFyaW1hKGFhcGxtb250aGx5X3RzLCBvcmRlcj1jKDAsMCwyKSkKc3VtbWFyeShtYV9tb2RlbCkKYGBgCgoKLSBUaGUgc21hbGwgTUEoMSkgY29lZmZpY2llbnQgc3VnZ2VzdHMgYSB3ZWFrIGltcGFjdCBvZiB0aGUgZXJyb3IgZnJvbSBvbmUgcGVyaW9kIGFnbywgd2hpbGUgdGhlIG1vZGVyYXRlIG5lZ2F0aXZlIE1BKDIpIGNvZWZmaWNpZW50IGluZGljYXRlcyBhIG1vcmUgbm90aWNlYWJsZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCB3aXRoIGVycm9ycyBmcm9tIHR3byBwZXJpb2RzIGFnby4KLSBUaGUgdmFyaWFuY2UgKHNpZ21hXjIpIGlzIG1vZGVyYXRlLCBjb25zaXN0ZW50IHdpdGggdGhlIEFSKDIpIG1vZGVsLCBzdWdnZXN0aW5nIGEgc2ltaWxhciBsZXZlbCBvZiB1bmV4cGxhaW5lZCB2b2xhdGlsaXR5LgotIFJNU0UgYW5kIE1BRSBhcmUgc2xpZ2h0bHkgbG93ZXIgdGhhbiB0aG9zZSBvZiB0aGUgQVIoMikgbW9kZWwsIGluZGljYXRpbmcgdGhhdCB0aGUgTUEoMikgbW9kZWwgbWF5IGZpdCB0aGUgZGF0YSBzbGlnaHRseSBiZXR0ZXIgaW4gdGVybXMgb2YgYWJzb2x1dGUgZXJyb3IgbWV0cmljcy4KLSBUaGUgQUlDIGFuZCBCSUMgdmFsdWVzIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2Ugb2YgdGhlIEFSKDIpIG1vZGVsLCBzdWdnZXN0aW5nIHRoYXQgYm90aCBtb2RlbHMgYXJlIGNvbXBhcmFibGUgaW4gZml0LgotIFRoZSBzbGlnaHRseSBsb3dlciBBSUMgc3VnZ2VzdHMgdGhlIE1BKDIpIG1vZGVsIG1pZ2h0IGJlIG1hcmdpbmFsbHkgYmV0dGVyIGluIHRlcm1zIG9mIGJhbGFuY2luZyBtb2RlbCBjb21wbGV4aXR5IGFuZCBnb29kbmVzcyBvZiBmaXQuCgoKIyMjIyMgUmVzaWR1YWwgQW5hbHlzaXMKCmBgYHtyfQojIFBlcmZvcm0gZGlhZ25vc3RpY3MgZm9yIE1BKDIpCnRzZGlhZyhtYV9tb2RlbCwgZ29mLmxhZyA9IDEwLCBtYWluID0gIkRpYWdub3N0aWNzIGZvciBNQSgyKSIpCgojIFEtUSBwbG90IGZvciBNQSgyKQpyZXNpZHVhbHNfbWEyIDwtIHJlc2lkdWFscyhtYV9tb2RlbCkKcXFub3JtKHJlc2lkdWFsc19tYTIsIG1haW4gPSAiUS1RIFBsb3Qgb2YgUmVzaWR1YWxzIGZvciBNQSgyKSIpCnFxbGluZShyZXNpZHVhbHNfbWEyLCBjb2wgPSAicmVkIikKYGBgCgoKCgojIyMjIEFSTUEgTW9kZWwKYGBge3J9CiMgRml0IEFSTUEoMSwxLDEpIG1vZGVsCmFybWFfbW9kZWwxIDwtIEFyaW1hKGFhcGxtb250aGx5X3RzLCBvcmRlcj1jKDEsMSwxKSkKc3VtbWFyeShhcm1hX21vZGVsMSkKYGBgCgoKLSBUaGUgQVIgY29lZmZpY2llbnQgaXMgd2VhaywgaW5kaWNhdGluZyBhIGxpbWl0ZWQgZWZmZWN0IG9mIHBhc3QgdmFsdWVzIG9uIGN1cnJlbnQgdmFsdWVzLiBUaGUgTUEgY29lZmZpY2llbnQgaXMgdmVyeSBzdHJvbmcsIGluZGljYXRpbmcgc2lnbmlmaWNhbnQgY29ycmVjdGlvbiBiYXNlZCBvbiBwYXN0IGVycm9ycy4KLSBUaGUgZGlmZmVyZW5jaW5nIHBhcnQgb2YgdGhlIEFSSU1BIG1vZGVsIHN1Z2dlc3RzIHRoYXQgdGhlIGRhdGEgaGFzIGJlZW4gdHJhbnNmb3JtZWQgdG8gYWNoaWV2ZSBzdGF0aW9uYXJpdHksIHdoaWNoIG1pZ2h0IGV4cGxhaW4gd2h5IHRoZSBBUiBjb21wb25lbnQgaXMgd2Vhay4KLSBUaGUgdmFyaWFuY2Ugb2YgdGhlIHJlc2lkdWFscyBpcyBtb2RlcmF0ZSwgc3VnZ2VzdGluZyBzb21lIHVuZXhwbGFpbmVkIHZhcmlhYmlsaXR5IGluIHRoZSBkYXRhLgotIFJNU0UgYW5kIE1BRSBhcmUgaGlnaGVyIHRoYW4gaW4gQVIoMikgYW5kIE1BKDIpLCBpbmRpY2F0aW5nIGxlc3MgcHJlY2lzZSBwcmVkaWN0aW9ucy4KLSBUaGUgQUlDIGFuZCBCSUMgdmFsdWVzIHN1Z2dlc3QgdGhpcyBtb2RlbCBtaWdodCBub3QgYmUgdGhlIGJlc3QgZml0IGNvbXBhcmVkIHRvIHNpbXBsZXIgbW9kZWxzIGxpa2UgQVIoMikgYW5kIE1BKDIpLCB3aGljaCBoYWQgbG93ZXIgQUlDL0JJQyB2YWx1ZXMuCgoKIyMjIyMgUmVzaWR1YWwgQW5hbHlzaXMKCmBgYHtyfQojIFBlcmZvcm0gZGlhZ25vc3RpY3MgZm9yIEFSSU1BKDEsMSwxKQp0c2RpYWcoYXJtYV9tb2RlbDEsIGdvZi5sYWcgPSAxMCwgbWFpbiA9ICJEaWFnbm9zdGljcyBmb3IgQVJJTUEoMSwxLDEpIikKCiMgUS1RIHBsb3QgZm9yIEFSSU1BKDEsMSwxKQpyZXNpZHVhbHNfYXJtYTExMSA8LSByZXNpZHVhbHMoYXJtYV9tb2RlbDEpCnFxbm9ybShyZXNpZHVhbHNfYXJtYTExMSwgbWFpbiA9ICJRLVEgUGxvdCBvZiBSZXNpZHVhbHMgZm9yIEFSSU1BKDEsMSwxKSIpCnFxbGluZShyZXNpZHVhbHNfYXJtYTExMSwgY29sID0gInJlZCIpCmBgYAoKCgoKCmBgYHtyfQojIEFSTUEoMiwxLDEpIE1vZGVsCmFybWFfbW9kZWwyIDwtIEFyaW1hKGFhcGxtb250aGx5X3RzLCBvcmRlcj1jKDIsMSwxKSkKc3VtbWFyeShhcm1hX21vZGVsMikKYGBgCgoKLSBUaGUgQVIgY29lZmZpY2llbnRzIHNob3cgYSBtaXhlZCBpbXBhY3QsIHdpdGggYSB3ZWFrIHBvc2l0aXZlIGVmZmVjdCBmcm9tIHRoZSBsYXN0IHBlcmlvZCBhbmQgYSBtb2RlcmF0ZSBuZWdhdGl2ZSBlZmZlY3QgZnJvbSB0d28gcGVyaW9kcyBhZ28uIFRoZSBzdHJvbmcgTUEoMSkgdGVybSBzdWdnZXN0cyB0aGF0IHJlY2VudCBlcnJvcnMgYXJlIGhlYXZpbHkgY29ycmVjdGVkLCB3aGljaCBtYXkgc21vb3RoIHRoZSBzZXJpZXMgdG9vIGFnZ3Jlc3NpdmVseS4KLSBUaGUgdmFyaWFuY2Ugb2YgdGhlIHJlc2lkdWFscyBpcyBtb2RlcmF0ZSwgaW5kaWNhdGluZyBhIGZhaXIgYW1vdW50IG9mIGV4cGxhaW5lZCB2YXJpYWJpbGl0eS4gVGhlIGVycm9yIG1lYXN1cmVzIChSTVNFIGFuZCBNQUUpIHN1Z2dlc3QgdGhhdCB0aGUgbW9kZWwgcHJvdmlkZXMgcmVhc29uYWJseSBhY2N1cmF0ZSBwcmVkaWN0aW9ucywgYWx0aG91Z2ggdGhlcmUgYXJlIHN0aWxsIGFyZWFzIGZvciBpbXByb3ZlbWVudC4KLSBUaGUgQUlDIGFuZCBCSUMgdmFsdWVzIGFyZSByZWxhdGl2ZWx5IGxvdywgaW5kaWNhdGluZyBhIGdvb2QgZml0IGNvbXBhcmVkIHRvIG90aGVyIG1vZGVscy4gVGhlIGxvZyBsaWtlbGlob29kIGlzIGFsc28gaGlnaGVyLCBzdXBwb3J0aW5nIHRoaXMgY29uY2x1c2lvbi4KLSBUaGUgQVJJTUEoMiwxLDEpIG1vZGVsIGNhcHR1cmVzIHRoZSBkYXRhIGR5bmFtaWNzIHdlbGwsIHdpdGggc3Ryb25nIGNvcnJlY3Rpb24gZm9yIHBhc3QgZXJyb3JzIGFuZCBhIHJlYXNvbmFibGUgYWNjb3VudCBvZiBwYXN0IHZhbHVlcy4gVGhlIG1vZGVsIGlzIGVmZmVjdGl2ZSBpbiBoYW5kbGluZyB0aGUgZGF0YSdzIHN0cnVjdHVyZSBhbmQgdHJlbmRzLCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGxvdyBlcnJvciBtZWFzdXJlcyBhbmQgQUNGMS4KCgojIyMjIyBSZXNpZHVhbCBBbmFseXNpcwoKYGBge3J9CiMgUGVyZm9ybSBkaWFnbm9zdGljcyBmb3IgQVJJTUEoMiwxLDEpCnRzZGlhZyhhcm1hX21vZGVsMiwgZ29mLmxhZyA9IDEwLCBtYWluID0gIkRpYWdub3N0aWNzIGZvciBBUklNQSgyLDEsMSkiKQoKIyBRLVEgcGxvdCBmb3IgQVJJTUEoMiwxLDEpCnJlc2lkdWFsc19hcm1hMjExIDwtIHJlc2lkdWFscyhhcm1hX21vZGVsMikKcXFub3JtKHJlc2lkdWFsc19hcm1hMjExLCBtYWluID0gIlEtUSBQbG90IG9mIFJlc2lkdWFscyBmb3IgQVJJTUEoMiwxLDEpIikKcXFsaW5lKHJlc2lkdWFsc19hcm1hMjExLCBjb2wgPSAicmVkIikKYGBgCgoKCmBgYHtyfQojIEFSTUEoMiwxLDIpIE1vZGVsCmFybWFfbW9kZWwzIDwtIEFyaW1hKGFhcGxtb250aGx5X3RzLCBvcmRlcj1jKDIsMSwyKSkKc3VtbWFyeShhcm1hX21vZGVsMykKYGBgCgoKLSBUaGUgQVIoMikgdGVybSBzZWVtcyBzaWduaWZpY2FudCwgd2hpbGUgdGhlIEFSKDEpIGFuZCBNQSgyKSB0ZXJtcyBhcmUgbGVzcyBpbXBhY3RmdWwuIFRoZSBNQSgxKSB0ZXJtIGlzIHN0cm9uZywgc3VnZ2VzdGluZyByZWxpYW5jZSBvbiBjb3JyZWN0aW5nIHRoZSBwcmV2aW91cyBwZXJpb2QncyBlcnJvci4KLSBUaGUgcmVzaWR1YWwgdmFyaWFuY2UgKHNpZ21hXjIpIGlzIHNsaWdodGx5IGhpZ2hlciB0aGFuIGRlc2lyZWQsIGluZGljYXRpbmcgc29tZSB1bmV4cGxhaW5lZCB2YXJpYWJpbGl0eS4gVGhlIEFDRjEgaXMgY2xvc2UgdG8gemVybywgd2hpY2ggaXMgcG9zaXRpdmUsIGluZGljYXRpbmcgbGl0dGxlIHJlbWFpbmluZyBhdXRvY29ycmVsYXRpb24uCi0gQ29tcGFyZWQgdG8gdGhlIEFSSU1BKDIsMSwxKSBtb2RlbCwgdGhpcyBtb2RlbCBoYXMgc2xpZ2h0bHkgaGlnaGVyIEFJQyBhbmQgQklDLCBzdWdnZXN0aW5nIGl0IG1pZ2h0IG5vdCBmaXQgYXMgd2VsbC4gSG93ZXZlciwgdGhlIHBlcmZvcm1hbmNlIG1ldHJpY3MgKFJNU0UsIE1BRSkgYXJlIGNvbXBldGl0aXZlLCBpbmRpY2F0aW5nIHRoaXMgbW9kZWwgaXMgYWxzbyBhIHZhbGlkIGNhbmRpZGF0ZS4KLSBXaGlsZSB0aGUgZXJyb3IgbWVhc3VyZXMgKE1BUEUsIE1QRSkgc2hvdyBzb21lIHByZWRpY3Rpb24gZXJyb3JzLCB0aGUgbW9kZWwgY2FwdHVyZXMgdGhlIGdlbmVyYWwgdHJlbmQgd2VsbC4gSW1wcm92ZW1lbnRzIGNvdWxkIGJlIG1hZGUgYnkgcmVmaW5pbmcgdGhlIG1vZGVsIG9yIHRlc3RpbmcgYWx0ZXJuYXRpdmUgc3BlY2lmaWNhdGlvbnMuCgoKCiMjIyMjIFJlc2lkdWFsIEFuYWx5c2lzCgpgYGB7cn0KIyBQZXJmb3JtIGRpYWdub3N0aWNzIGZvciBBUklNQSgyLDEsMikKdHNkaWFnKGFybWFfbW9kZWwzLCBnb2YubGFnID0gMTAsIG1haW4gPSAiRGlhZ25vc3RpY3MgZm9yIEFSSU1BKDIsMSwyKSIpCgojIFEtUSBwbG90IGZvciBBUklNQSgyLDEsMikKcmVzaWR1YWxzX2FybWEyMTIgPC0gcmVzaWR1YWxzKGFybWFfbW9kZWwzKQpxcW5vcm0ocmVzaWR1YWxzX2FybWEyMTIsIG1haW4gPSAiUS1RIFBsb3Qgb2YgUmVzaWR1YWxzIGZvciBBUklNQSgyLDEsMikiKQpxcWxpbmUocmVzaWR1YWxzX2FybWEyMTIsIGNvbCA9ICJyZWQiKQpgYGAKCgoKCiMjIyMgR0FSQ0ggTW9kZWxzCgpgYGB7cn0KIyBDcmVhdGUgYSB0aW1lIHNlcmllcyBvYmplY3QKYWFwbG1vbnRobHlfdHMyIDwtIHRzKGFhcGxfbW9udGhseV9kYXRhJENsb3NlLCBzdGFydD1jKDIwMTYsIDAxKSwgZW5kID0gYygyMDI0LCAwNSksIGZyZXF1ZW5jeT0xMikgCiMgQ2FsY3VsYXRlIHJldHVybnMgZm9yIG1vZGVsaW5nCnJldHVybnMgPC0gZGlmZihsb2coYWFwbG1vbnRobHlfdHMyKSkKcmV0dXJucyA8LSByZXR1cm5zWyFpcy5uYShyZXR1cm5zKV0KcGxvdChyZXR1cm5zLCBtYWluPSJNb250aGx5IEFwcGxlIFN0b2NrIFByaWNlcyIsIHlsYWI9IkNsb3NlIFByaWNlIiwgeGxhYj0iVGltZSIsIHR5cGU9ImwiKQpgYGAKCgpgYGB7cn0KIyBTcGVjaWZ5IEdBUkNIKDEsMSkgbW9kZWwKc3BlY19nYXJjaCA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJzR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24ubW9kZWwgPSAibm9ybSIpCgpmaXRfZ2FyY2ggPC0gdWdhcmNoZml0KHNwZWMgPSBzcGVjX2dhcmNoLCBkYXRhID0gcmV0dXJucykKCiMgRGlzcGxheSB0aGUgZml0IHN1bW1hcnkKZml0X2dhcmNoCmBgYAoKCmBgYHtyfQojIFNwZWNpZnkgR0FSQ0goMSwxKSBtb2RlbApzcGVjX2dhcmNoIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gInNHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJub3JtIikKCmZpdF9nYXJjaCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHNwZWNfZ2FyY2gsIGRhdGEgPSByZXR1cm5zKQoKIyBEaXNwbGF5IHRoZSBmaXQgc3VtbWFyeQpmaXRfZ2FyY2gKYGBgCgoKCmBgYHtyfQojIFBsb3QgZGlhZ25vc3RpY3MKcGxvdChmaXRfZ2FyY2gpCmBgYAoKCiMjIyMgRm9yZWNhc3RpbmcKCmBgYHtyfQojIEZvcmVjYXN0aW5nIHdpdGggdGhlIEdBUkNIIG1vZGVsCmZvcmVjYXN0X2dhcmNoIDwtIHVnYXJjaGZvcmVjYXN0KGZpdF9nYXJjaCwgbi5haGVhZD0xMikKcGxvdChmb3JlY2FzdF9nYXJjaCwgd2hpY2g9MSkgICMgRm9yZWNhc3Qgc2VyaWVzCmBgYAoKCiMjIyMgTW9kZWwgQ29tcGFyaXNvbgoKYGBge3J9CiMgQ29tcGFyaW5nIE1vZGVscyB1c2luZyBBSUMgYW5kIEJJQwptb2RlbHMgPC0gbGlzdChhcl9tb2RlbCwgbWFfbW9kZWwsIGFybWFfbW9kZWwxLCBhcm1hX21vZGVsMiwgYXJtYV9tb2RlbDMpCm1vZGVsX25hbWVzIDwtIGMoIkFSIiwgIk1BIiwgIkFSSU1BKDEsMSwxKSIsICJBUklNQSgyLDEsMSkiLCAiQVJJTUEoMiwxLDIiLCAiR0FSQ0giKQoKYWljX3ZhbHVlcyA8LSBjKHNhcHBseShtb2RlbHMsIEFJQyksIC0yLjA3NzUpCmJpY192YWx1ZXMgPC0gYyhzYXBwbHkobW9kZWxzLCBCSUMpLCAtMS45NDczKQoKY29tcGFyaXNvbiA8LSBkYXRhLmZyYW1lKE1vZGVsPW1vZGVsX25hbWVzLCBBSUM9YWljX3ZhbHVlcywgQklDPWJpY192YWx1ZXMpCnByaW50KGNvbXBhcmlzb24pCmBgYAoKCgoKCgoKCgoKCgoKCgoK